class FormOperation {
	constructor(area, refName) {
		const { ctx, nameManger } = area;
		this.ctx = ctx;
		this.refName = refName;
		this.values = nameManger.values;
	}
	ref() {
		const { frame } = this.ctx.component;
		// 由于hook与area绑定，首次弹出再关闭页面，原来的节点被销毁
		// 所以在再次调用该节点的方法，则应该忽略，直接放行即可
		return frame?.$refs[this.refName];
	}
	checkName(name, callback) {
		if (typeof name === 'string') {
			if (Reflect.has(this.values, name)) {
				return callback && callback();
			}
		} else {
			throw new Error('参数 name 须定义为字符串');
		}
	}
	getFieldValue(name) {
		return this.checkName(name, () => this.values[name]);
	}
	getFieldsValue() {
		return { ...this.values };
	}
	setFieldsValue(values, isResplace = true) {
		for (let field in this.values) {
			if (isResplace) {
				this.values[field] = values[field];
			} else {
				if (Reflect.has(values, field)) {
					this.values[field] = values[field];
				}
			}
		}
	}
	setFieldValue(name, value) {
		this.checkName(name, () => this.values[name] = value);
	}
	// 验证具体的某个字段
	validateField(name) {
		return this.checkName(name, () =>
			new Promise((resolve, reject) => {
				this.ref()?.validateField(name, (errorMessage) => {
					if (errorMessage) {
						reject(errorMessage);
					} else {
						// 校验成功，需要返回结果数据
						resolve(this.values[name]);
					}
				});
			})
		);
	}
	validateFields() {
		return new Promise((resolve, reject) => {
			this.ref()?.validate((valid) => {
				if (valid) {
					// 校验成功，需要返回结果数据
					resolve(this.getFieldsValue());
				} else {
					reject();
					return false;
				}
			});
		});
	}
	// 重置该表单项，将其值重置为初始值，并移除校验结果
	resetFields() {
		return this.ref()?.resetFields();
	}
	// 滚动到指定的字段
	scrollToField() {
		return this.ref()?.scrollToField();
	}
	// 清理某个字段的表单验证信息
	clearValidate() {
		return this.ref()?.clearValidate();
	}
}
export default FormOperation;